﻿<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8" />
    <style>
        a, b, body, div, font, h1, h2, h3, h4, i, input, lp, select, td, u {
            font-family: Arial,宋体;
            font-size: 16px;
        }

            a:link {
                text-decoration: none;
            }

        table {
            border: 0;
            border-collapse: collapse;
            border-spacing: 0;
            width: 100%;
        }

        pre {
            display: inline;
            white-space: pre-wrap;
            word-wrap: break-word;
        }

        .divHeader {
            display: flex;
            justify-content: space-between;
            align-items: center;
            background: #F1F1F1;
            border: 1px solid #E0E0E0;
            padding: 10px 20px;
        }

        .trClass {
            height: 40px;
            vertical-align: bottom;
        }

        .trMethod {
            height: 30px;
        }

        .tdMethod {
            width: 20%;
        }

        .trLeft {
            height: 20px;
        }

        .tdParam {
            border-right: 1px solid #C3C3C3;
            border-bottom: 1px solid #C3C3C3;
            padding-left: 5px;
        }

        .aTitle {
            font-size: 20px;
            margin-left: 20px;
        }

        .logTitle {
            background: green;
            padding: 4px;
        }
    </style>
    <script>
        // 解压gzip，https://cdn.bootcss.com/pako/1.0.9/pako_inflate.min.js
        !function (e) { if ("object" == typeof exports && "undefined" != typeof module) module.exports = e(); else if ("function" == typeof define && define.amd) define([], e); else { ("undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : this).pako = e() } }(function () { return function r(o, s, f) { function l(t, e) { if (!s[t]) { if (!o[t]) { var i = "function" == typeof require && require; if (!e && i) return i(t, !0); if (d) return d(t, !0); var n = new Error("Cannot find module '" + t + "'"); throw n.code = "MODULE_NOT_FOUND", n } var a = s[t] = { exports: {} }; o[t][0].call(a.exports, function (e) { return l(o[t][1][e] || e) }, a, a.exports, r, o, s, f) } return s[t].exports } for (var d = "function" == typeof require && require, e = 0; e < f.length; e++)l(f[e]); return l }({ 1: [function (e, t, i) { "use strict"; var n = "undefined" != typeof Uint8Array && "undefined" != typeof Uint16Array && "undefined" != typeof Int32Array; i.assign = function (e) { for (var t, i, n = Array.prototype.slice.call(arguments, 1); n.length;) { var a = n.shift(); if (a) { if ("object" != typeof a) throw new TypeError(a + "must be non-object"); for (var r in a) t = a, i = r, Object.prototype.hasOwnProperty.call(t, i) && (e[r] = a[r]) } } return e }, i.shrinkBuf = function (e, t) { return e.length === t ? e : e.subarray ? e.subarray(0, t) : (e.length = t, e) }; var a = { arraySet: function (e, t, i, n, a) { if (t.subarray && e.subarray) e.set(t.subarray(i, i + n), a); else for (var r = 0; r < n; r++)e[a + r] = t[i + r] }, flattenChunks: function (e) { var t, i, n, a, r, o; for (t = n = 0, i = e.length; t < i; t++)n += e[t].length; for (o = new Uint8Array(n), t = a = 0, i = e.length; t < i; t++)r = e[t], o.set(r, a), a += r.length; return o } }, r = { arraySet: function (e, t, i, n, a) { for (var r = 0; r < n; r++)e[a + r] = t[i + r] }, flattenChunks: function (e) { return [].concat.apply([], e) } }; i.setTyped = function (e) { e ? (i.Buf8 = Uint8Array, i.Buf16 = Uint16Array, i.Buf32 = Int32Array, i.assign(i, a)) : (i.Buf8 = Array, i.Buf16 = Array, i.Buf32 = Array, i.assign(i, r)) }, i.setTyped(n) }, {}], 2: [function (e, t, i) { "use strict"; var f = e("./common"), a = !0, r = !0; try { String.fromCharCode.apply(null, [0]) } catch (e) { a = !1 } try { String.fromCharCode.apply(null, new Uint8Array(1)) } catch (e) { r = !1 } for (var l = new f.Buf8(256), n = 0; n < 256; n++)l[n] = 252 <= n ? 6 : 248 <= n ? 5 : 240 <= n ? 4 : 224 <= n ? 3 : 192 <= n ? 2 : 1; function d(e, t) { if (t < 65534 && (e.subarray && r || !e.subarray && a)) return String.fromCharCode.apply(null, f.shrinkBuf(e, t)); for (var i = "", n = 0; n < t; n++)i += String.fromCharCode(e[n]); return i } l[254] = l[254] = 1, i.string2buf = function (e) { var t, i, n, a, r, o = e.length, s = 0; for (a = 0; a < o; a++)55296 == (64512 & (i = e.charCodeAt(a))) && a + 1 < o && 56320 == (64512 & (n = e.charCodeAt(a + 1))) && (i = 65536 + (i - 55296 << 10) + (n - 56320), a++), s += i < 128 ? 1 : i < 2048 ? 2 : i < 65536 ? 3 : 4; for (t = new f.Buf8(s), a = r = 0; r < s; a++)55296 == (64512 & (i = e.charCodeAt(a))) && a + 1 < o && 56320 == (64512 & (n = e.charCodeAt(a + 1))) && (i = 65536 + (i - 55296 << 10) + (n - 56320), a++), t[r++] = i < 128 ? i : (t[r++] = i < 2048 ? 192 | i >>> 6 : (t[r++] = i < 65536 ? 224 | i >>> 12 : (t[r++] = 240 | i >>> 18, 128 | i >>> 12 & 63), 128 | i >>> 6 & 63), 128 | 63 & i); return t }, i.buf2binstring = function (e) { return d(e, e.length) }, i.binstring2buf = function (e) { for (var t = new f.Buf8(e.length), i = 0, n = t.length; i < n; i++)t[i] = e.charCodeAt(i); return t }, i.buf2string = function (e, t) { var i, n, a, r, o = t || e.length, s = new Array(2 * o); for (i = n = 0; i < o;)if ((a = e[i++]) < 128) s[n++] = a; else if (4 < (r = l[a])) s[n++] = 65533, i += r - 1; else { for (a &= 2 === r ? 31 : 3 === r ? 15 : 7; 1 < r && i < o;)a = a << 6 | 63 & e[i++], r--; s[n++] = 1 < r ? 65533 : a < 65536 ? a : (a -= 65536, s[n++] = 55296 | a >> 10 & 1023, 56320 | 1023 & a) } return d(s, n) }, i.utf8border = function (e, t) { var i; for ((t = t || e.length) > e.length && (t = e.length), i = t - 1; 0 <= i && 128 == (192 & e[i]);)i--; return i < 0 ? t : 0 === i ? t : i + l[e[i]] > t ? i : t } }, { "./common": 1 }], 3: [function (e, t, i) { "use strict"; t.exports = function (e, t, i, n) { for (var a = 65535 & e | 0, r = e >>> 16 & 65535 | 0, o = 0; 0 !== i;) { for (i -= o = 2e3 < i ? 2e3 : i; r = r + (a = a + t[n++] | 0) | 0, --o;); a %= 65521, r %= 65521 } return a | r << 16 | 0 } }, {}], 4: [function (e, t, i) { "use strict"; t.exports = { Z_NO_FLUSH: 0, Z_PARTIAL_FLUSH: 1, Z_SYNC_FLUSH: 2, Z_FULL_FLUSH: 3, Z_FINISH: 4, Z_BLOCK: 5, Z_TREES: 6, Z_OK: 0, Z_STREAM_END: 1, Z_NEED_DICT: 2, Z_ERRNO: -1, Z_STREAM_ERROR: -2, Z_DATA_ERROR: -3, Z_BUF_ERROR: -5, Z_NO_COMPRESSION: 0, Z_BEST_SPEED: 1, Z_BEST_COMPRESSION: 9, Z_DEFAULT_COMPRESSION: -1, Z_FILTERED: 1, Z_HUFFMAN_ONLY: 2, Z_RLE: 3, Z_FIXED: 4, Z_DEFAULT_STRATEGY: 0, Z_BINARY: 0, Z_TEXT: 1, Z_UNKNOWN: 2, Z_DEFLATED: 8 } }, {}], 5: [function (e, t, i) { "use strict"; var s = function () { for (var e, t = [], i = 0; i < 256; i++) { e = i; for (var n = 0; n < 8; n++)e = 1 & e ? 3988292384 ^ e >>> 1 : e >>> 1; t[i] = e } return t }(); t.exports = function (e, t, i, n) { var a = s, r = n + i; e ^= -1; for (var o = n; o < r; o++)e = e >>> 8 ^ a[255 & (e ^ t[o])]; return -1 ^ e } }, {}], 6: [function (e, t, i) { "use strict"; t.exports = function () { this.text = 0, this.time = 0, this.xflags = 0, this.os = 0, this.extra = null, this.extra_len = 0, this.name = "", this.comment = "", this.hcrc = 0, this.done = !1 } }, {}], 7: [function (e, t, i) { "use strict"; t.exports = function (e, t) { var i, n, a, r, o, s, f, l, d, c, u, h, b, m, w, k, _, g, v, p, x, y, S, E, Z; i = e.state, n = e.next_in, E = e.input, a = n + (e.avail_in - 5), r = e.next_out, Z = e.output, o = r - (t - e.avail_out), s = r + (e.avail_out - 257), f = i.dmax, l = i.wsize, d = i.whave, c = i.wnext, u = i.window, h = i.hold, b = i.bits, m = i.lencode, w = i.distcode, k = (1 << i.lenbits) - 1, _ = (1 << i.distbits) - 1; e: do { b < 15 && (h += E[n++] << b, b += 8, h += E[n++] << b, b += 8), g = m[h & k]; t: for (; ;) { if (h >>>= v = g >>> 24, b -= v, 0 === (v = g >>> 16 & 255)) Z[r++] = 65535 & g; else { if (!(16 & v)) { if (0 == (64 & v)) { g = m[(65535 & g) + (h & (1 << v) - 1)]; continue t } if (32 & v) { i.mode = 12; break e } e.msg = "invalid literal/length code", i.mode = 30; break e } p = 65535 & g, (v &= 15) && (b < v && (h += E[n++] << b, b += 8), p += h & (1 << v) - 1, h >>>= v, b -= v), b < 15 && (h += E[n++] << b, b += 8, h += E[n++] << b, b += 8), g = w[h & _]; i: for (; ;) { if (h >>>= v = g >>> 24, b -= v, !(16 & (v = g >>> 16 & 255))) { if (0 == (64 & v)) { g = w[(65535 & g) + (h & (1 << v) - 1)]; continue i } e.msg = "invalid distance code", i.mode = 30; break e } if (x = 65535 & g, b < (v &= 15) && (h += E[n++] << b, (b += 8) < v && (h += E[n++] << b, b += 8)), f < (x += h & (1 << v) - 1)) { e.msg = "invalid distance too far back", i.mode = 30; break e } if (h >>>= v, b -= v, (v = r - o) < x) { if (d < (v = x - v) && i.sane) { e.msg = "invalid distance too far back", i.mode = 30; break e } if (S = u, (y = 0) === c) { if (y += l - v, v < p) { for (p -= v; Z[r++] = u[y++], --v;); y = r - x, S = Z } } else if (c < v) { if (y += l + c - v, (v -= c) < p) { for (p -= v; Z[r++] = u[y++], --v;); if (y = 0, c < p) { for (p -= v = c; Z[r++] = u[y++], --v;); y = r - x, S = Z } } } else if (y += c - v, v < p) { for (p -= v; Z[r++] = u[y++], --v;); y = r - x, S = Z } for (; 2 < p;)Z[r++] = S[y++], Z[r++] = S[y++], Z[r++] = S[y++], p -= 3; p && (Z[r++] = S[y++], 1 < p && (Z[r++] = S[y++])) } else { for (y = r - x; Z[r++] = Z[y++], Z[r++] = Z[y++], Z[r++] = Z[y++], 2 < (p -= 3);); p && (Z[r++] = Z[y++], 1 < p && (Z[r++] = Z[y++])) } break } } break } } while (n < a && r < s); n -= p = b >> 3, h &= (1 << (b -= p << 3)) - 1, e.next_in = n, e.next_out = r, e.avail_in = n < a ? a - n + 5 : 5 - (n - a), e.avail_out = r < s ? s - r + 257 : 257 - (r - s), i.hold = h, i.bits = b } }, {}], 8: [function (e, t, i) { "use strict"; var z = e("../utils/common"), R = e("./adler32"), N = e("./crc32"), O = e("./inffast"), C = e("./inftrees"), I = 1, D = 2, T = 0, U = -2, F = 1, n = 852, a = 592; function L(e) { return (e >>> 24 & 255) + (e >>> 8 & 65280) + ((65280 & e) << 8) + ((255 & e) << 24) } function r() { this.mode = 0, this.last = !1, this.wrap = 0, this.havedict = !1, this.flags = 0, this.dmax = 0, this.check = 0, this.total = 0, this.head = null, this.wbits = 0, this.wsize = 0, this.whave = 0, this.wnext = 0, this.window = null, this.hold = 0, this.bits = 0, this.length = 0, this.offset = 0, this.extra = 0, this.lencode = null, this.distcode = null, this.lenbits = 0, this.distbits = 0, this.ncode = 0, this.nlen = 0, this.ndist = 0, this.have = 0, this.next = null, this.lens = new z.Buf16(320), this.work = new z.Buf16(288), this.lendyn = null, this.distdyn = null, this.sane = 0, this.back = 0, this.was = 0 } function o(e) { var t; return e && e.state ? (t = e.state, e.total_in = e.total_out = t.total = 0, e.msg = "", t.wrap && (e.adler = 1 & t.wrap), t.mode = F, t.last = 0, t.havedict = 0, t.dmax = 32768, t.head = null, t.hold = 0, t.bits = 0, t.lencode = t.lendyn = new z.Buf32(n), t.distcode = t.distdyn = new z.Buf32(a), t.sane = 1, t.back = -1, T) : U } function s(e) { var t; return e && e.state ? ((t = e.state).wsize = 0, t.whave = 0, t.wnext = 0, o(e)) : U } function f(e, t) { var i, n; return e && e.state ? (n = e.state, t < 0 ? (i = 0, t = -t) : (i = 1 + (t >> 4), t < 48 && (t &= 15)), t && (t < 8 || 15 < t) ? U : (null !== n.window && n.wbits !== t && (n.window = null), n.wrap = i, n.wbits = t, s(e))) : U } function l(e, t) { var i, n; return e ? (n = new r, (e.state = n).window = null, (i = f(e, t)) !== T && (e.state = null), i) : U } var d, c, u = !0; function H(e) { if (u) { var t; for (d = new z.Buf32(512), c = new z.Buf32(32), t = 0; t < 144;)e.lens[t++] = 8; for (; t < 256;)e.lens[t++] = 9; for (; t < 280;)e.lens[t++] = 7; for (; t < 288;)e.lens[t++] = 8; for (C(I, e.lens, 0, 288, d, 0, e.work, { bits: 9 }), t = 0; t < 32;)e.lens[t++] = 5; C(D, e.lens, 0, 32, c, 0, e.work, { bits: 5 }), u = !1 } e.lencode = d, e.lenbits = 9, e.distcode = c, e.distbits = 5 } function j(e, t, i, n) { var a, r = e.state; return null === r.window && (r.wsize = 1 << r.wbits, r.wnext = 0, r.whave = 0, r.window = new z.Buf8(r.wsize)), n >= r.wsize ? (z.arraySet(r.window, t, i - r.wsize, r.wsize, 0), r.wnext = 0, r.whave = r.wsize) : (n < (a = r.wsize - r.wnext) && (a = n), z.arraySet(r.window, t, i - n, a, r.wnext), (n -= a) ? (z.arraySet(r.window, t, i - n, n, 0), r.wnext = n, r.whave = r.wsize) : (r.wnext += a, r.wnext === r.wsize && (r.wnext = 0), r.whave < r.wsize && (r.whave += a))), 0 } i.inflateReset = s, i.inflateReset2 = f, i.inflateResetKeep = o, i.inflateInit = function (e) { return l(e, 15) }, i.inflateInit2 = l, i.inflate = function (e, t) { var i, n, a, r, o, s, f, l, d, c, u, h, b, m, w, k, _, g, v, p, x, y, S, E, Z = 0, B = new z.Buf8(4), A = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; if (!e || !e.state || !e.output || !e.input && 0 !== e.avail_in) return U; 12 === (i = e.state).mode && (i.mode = 13), o = e.next_out, a = e.output, f = e.avail_out, r = e.next_in, n = e.input, s = e.avail_in, l = i.hold, d = i.bits, c = s, u = f, y = T; e: for (; ;)switch (i.mode) { case F: if (0 === i.wrap) { i.mode = 13; break } for (; d < 16;) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } if (2 & i.wrap && 35615 === l) { B[i.check = 0] = 255 & l, B[1] = l >>> 8 & 255, i.check = N(i.check, B, 2, 0), d = l = 0, i.mode = 2; break } if (i.flags = 0, i.head && (i.head.done = !1), !(1 & i.wrap) || (((255 & l) << 8) + (l >> 8)) % 31) { e.msg = "incorrect header check", i.mode = 30; break } if (8 != (15 & l)) { e.msg = "unknown compression method", i.mode = 30; break } if (d -= 4, x = 8 + (15 & (l >>>= 4)), 0 === i.wbits) i.wbits = x; else if (x > i.wbits) { e.msg = "invalid window size", i.mode = 30; break } i.dmax = 1 << x, e.adler = i.check = 1, i.mode = 512 & l ? 10 : 12, d = l = 0; break; case 2: for (; d < 16;) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } if (i.flags = l, 8 != (255 & i.flags)) { e.msg = "unknown compression method", i.mode = 30; break } if (57344 & i.flags) { e.msg = "unknown header flags set", i.mode = 30; break } i.head && (i.head.text = l >> 8 & 1), 512 & i.flags && (B[0] = 255 & l, B[1] = l >>> 8 & 255, i.check = N(i.check, B, 2, 0)), d = l = 0, i.mode = 3; case 3: for (; d < 32;) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } i.head && (i.head.time = l), 512 & i.flags && (B[0] = 255 & l, B[1] = l >>> 8 & 255, B[2] = l >>> 16 & 255, B[3] = l >>> 24 & 255, i.check = N(i.check, B, 4, 0)), d = l = 0, i.mode = 4; case 4: for (; d < 16;) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } i.head && (i.head.xflags = 255 & l, i.head.os = l >> 8), 512 & i.flags && (B[0] = 255 & l, B[1] = l >>> 8 & 255, i.check = N(i.check, B, 2, 0)), d = l = 0, i.mode = 5; case 5: if (1024 & i.flags) { for (; d < 16;) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } i.length = l, i.head && (i.head.extra_len = l), 512 & i.flags && (B[0] = 255 & l, B[1] = l >>> 8 & 255, i.check = N(i.check, B, 2, 0)), d = l = 0 } else i.head && (i.head.extra = null); i.mode = 6; case 6: if (1024 & i.flags && (s < (h = i.length) && (h = s), h && (i.head && (x = i.head.extra_len - i.length, i.head.extra || (i.head.extra = new Array(i.head.extra_len)), z.arraySet(i.head.extra, n, r, h, x)), 512 & i.flags && (i.check = N(i.check, n, h, r)), s -= h, r += h, i.length -= h), i.length)) break e; i.length = 0, i.mode = 7; case 7: if (2048 & i.flags) { if (0 === s) break e; for (h = 0; x = n[r + h++], i.head && x && i.length < 65536 && (i.head.name += String.fromCharCode(x)), x && h < s;); if (512 & i.flags && (i.check = N(i.check, n, h, r)), s -= h, r += h, x) break e } else i.head && (i.head.name = null); i.length = 0, i.mode = 8; case 8: if (4096 & i.flags) { if (0 === s) break e; for (h = 0; x = n[r + h++], i.head && x && i.length < 65536 && (i.head.comment += String.fromCharCode(x)), x && h < s;); if (512 & i.flags && (i.check = N(i.check, n, h, r)), s -= h, r += h, x) break e } else i.head && (i.head.comment = null); i.mode = 9; case 9: if (512 & i.flags) { for (; d < 16;) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } if (l !== (65535 & i.check)) { e.msg = "header crc mismatch", i.mode = 30; break } d = l = 0 } i.head && (i.head.hcrc = i.flags >> 9 & 1, i.head.done = !0), e.adler = i.check = 0, i.mode = 12; break; case 10: for (; d < 32;) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } e.adler = i.check = L(l), d = l = 0, i.mode = 11; case 11: if (0 === i.havedict) return e.next_out = o, e.avail_out = f, e.next_in = r, e.avail_in = s, i.hold = l, i.bits = d, 2; e.adler = i.check = 1, i.mode = 12; case 12: if (5 === t || 6 === t) break e; case 13: if (i.last) { l >>>= 7 & d, d -= 7 & d, i.mode = 27; break } for (; d < 3;) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } switch (i.last = 1 & l, d -= 1, 3 & (l >>>= 1)) { case 0: i.mode = 14; break; case 1: if (H(i), i.mode = 20, 6 !== t) break; l >>>= 2, d -= 2; break e; case 2: i.mode = 17; break; case 3: e.msg = "invalid block type", i.mode = 30 }l >>>= 2, d -= 2; break; case 14: for (l >>>= 7 & d, d -= 7 & d; d < 32;) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } if ((65535 & l) != (l >>> 16 ^ 65535)) { e.msg = "invalid stored block lengths", i.mode = 30; break } if (i.length = 65535 & l, d = l = 0, i.mode = 15, 6 === t) break e; case 15: i.mode = 16; case 16: if (h = i.length) { if (s < h && (h = s), f < h && (h = f), 0 === h) break e; z.arraySet(a, n, r, h, o), s -= h, r += h, f -= h, o += h, i.length -= h; break } i.mode = 12; break; case 17: for (; d < 14;) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } if (i.nlen = 257 + (31 & l), l >>>= 5, d -= 5, i.ndist = 1 + (31 & l), l >>>= 5, d -= 5, i.ncode = 4 + (15 & l), l >>>= 4, d -= 4, 286 < i.nlen || 30 < i.ndist) { e.msg = "too many length or distance symbols", i.mode = 30; break } i.have = 0, i.mode = 18; case 18: for (; i.have < i.ncode;) { for (; d < 3;) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } i.lens[A[i.have++]] = 7 & l, l >>>= 3, d -= 3 } for (; i.have < 19;)i.lens[A[i.have++]] = 0; if (i.lencode = i.lendyn, i.lenbits = 7, S = { bits: i.lenbits }, y = C(0, i.lens, 0, 19, i.lencode, 0, i.work, S), i.lenbits = S.bits, y) { e.msg = "invalid code lengths set", i.mode = 30; break } i.have = 0, i.mode = 19; case 19: for (; i.have < i.nlen + i.ndist;) { for (; k = (Z = i.lencode[l & (1 << i.lenbits) - 1]) >>> 16 & 255, _ = 65535 & Z, !((w = Z >>> 24) <= d);) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } if (_ < 16) l >>>= w, d -= w, i.lens[i.have++] = _; else { if (16 === _) { for (E = w + 2; d < E;) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } if (l >>>= w, d -= w, 0 === i.have) { e.msg = "invalid bit length repeat", i.mode = 30; break } x = i.lens[i.have - 1], h = 3 + (3 & l), l >>>= 2, d -= 2 } else if (17 === _) { for (E = w + 3; d < E;) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } d -= w, x = 0, h = 3 + (7 & (l >>>= w)), l >>>= 3, d -= 3 } else { for (E = w + 7; d < E;) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } d -= w, x = 0, h = 11 + (127 & (l >>>= w)), l >>>= 7, d -= 7 } if (i.have + h > i.nlen + i.ndist) { e.msg = "invalid bit length repeat", i.mode = 30; break } for (; h--;)i.lens[i.have++] = x } } if (30 === i.mode) break; if (0 === i.lens[256]) { e.msg = "invalid code -- missing end-of-block", i.mode = 30; break } if (i.lenbits = 9, S = { bits: i.lenbits }, y = C(I, i.lens, 0, i.nlen, i.lencode, 0, i.work, S), i.lenbits = S.bits, y) { e.msg = "invalid literal/lengths set", i.mode = 30; break } if (i.distbits = 6, i.distcode = i.distdyn, S = { bits: i.distbits }, y = C(D, i.lens, i.nlen, i.ndist, i.distcode, 0, i.work, S), i.distbits = S.bits, y) { e.msg = "invalid distances set", i.mode = 30; break } if (i.mode = 20, 6 === t) break e; case 20: i.mode = 21; case 21: if (6 <= s && 258 <= f) { e.next_out = o, e.avail_out = f, e.next_in = r, e.avail_in = s, i.hold = l, i.bits = d, O(e, u), o = e.next_out, a = e.output, f = e.avail_out, r = e.next_in, n = e.input, s = e.avail_in, l = i.hold, d = i.bits, 12 === i.mode && (i.back = -1); break } for (i.back = 0; k = (Z = i.lencode[l & (1 << i.lenbits) - 1]) >>> 16 & 255, _ = 65535 & Z, !((w = Z >>> 24) <= d);) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } if (k && 0 == (240 & k)) { for (g = w, v = k, p = _; k = (Z = i.lencode[p + ((l & (1 << g + v) - 1) >> g)]) >>> 16 & 255, _ = 65535 & Z, !(g + (w = Z >>> 24) <= d);) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } l >>>= g, d -= g, i.back += g } if (l >>>= w, d -= w, i.back += w, i.length = _, 0 === k) { i.mode = 26; break } if (32 & k) { i.back = -1, i.mode = 12; break } if (64 & k) { e.msg = "invalid literal/length code", i.mode = 30; break } i.extra = 15 & k, i.mode = 22; case 22: if (i.extra) { for (E = i.extra; d < E;) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } i.length += l & (1 << i.extra) - 1, l >>>= i.extra, d -= i.extra, i.back += i.extra } i.was = i.length, i.mode = 23; case 23: for (; k = (Z = i.distcode[l & (1 << i.distbits) - 1]) >>> 16 & 255, _ = 65535 & Z, !((w = Z >>> 24) <= d);) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } if (0 == (240 & k)) { for (g = w, v = k, p = _; k = (Z = i.distcode[p + ((l & (1 << g + v) - 1) >> g)]) >>> 16 & 255, _ = 65535 & Z, !(g + (w = Z >>> 24) <= d);) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } l >>>= g, d -= g, i.back += g } if (l >>>= w, d -= w, i.back += w, 64 & k) { e.msg = "invalid distance code", i.mode = 30; break } i.offset = _, i.extra = 15 & k, i.mode = 24; case 24: if (i.extra) { for (E = i.extra; d < E;) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } i.offset += l & (1 << i.extra) - 1, l >>>= i.extra, d -= i.extra, i.back += i.extra } if (i.offset > i.dmax) { e.msg = "invalid distance too far back", i.mode = 30; break } i.mode = 25; case 25: if (0 === f) break e; if (h = u - f, i.offset > h) { if ((h = i.offset - h) > i.whave && i.sane) { e.msg = "invalid distance too far back", i.mode = 30; break } b = h > i.wnext ? (h -= i.wnext, i.wsize - h) : i.wnext - h, h > i.length && (h = i.length), m = i.window } else m = a, b = o - i.offset, h = i.length; for (f < h && (h = f), f -= h, i.length -= h; a[o++] = m[b++], --h;); 0 === i.length && (i.mode = 21); break; case 26: if (0 === f) break e; a[o++] = i.length, f--, i.mode = 21; break; case 27: if (i.wrap) { for (; d < 32;) { if (0 === s) break e; s--, l |= n[r++] << d, d += 8 } if (u -= f, e.total_out += u, i.total += u, u && (e.adler = i.check = i.flags ? N(i.check, a, u, o - u) : R(i.check, a, u, o - u)), u = f, (i.flags ? l : L(l)) !== i.check) { e.msg = "incorrect data check", i.mode = 30; break } d = l = 0 } i.mode = 28; case 28: if (i.wrap && i.flags) { for (; d < 32;) { if (0 === s) break e; s--, l += n[r++] << d, d += 8 } if (l !== (4294967295 & i.total)) { e.msg = "incorrect length check", i.mode = 30; break } d = l = 0 } i.mode = 29; case 29: y = 1; break e; case 30: y = -3; break e; case 31: return -4; case 32: default: return U }return e.next_out = o, e.avail_out = f, e.next_in = r, e.avail_in = s, i.hold = l, i.bits = d, (i.wsize || u !== e.avail_out && i.mode < 30 && (i.mode < 27 || 4 !== t)) && j(e, e.output, e.next_out, u - e.avail_out) ? (i.mode = 31, -4) : (c -= e.avail_in, u -= e.avail_out, e.total_in += c, e.total_out += u, i.total += u, i.wrap && u && (e.adler = i.check = i.flags ? N(i.check, a, u, e.next_out - u) : R(i.check, a, u, e.next_out - u)), e.data_type = i.bits + (i.last ? 64 : 0) + (12 === i.mode ? 128 : 0) + (20 === i.mode || 15 === i.mode ? 256 : 0), (0 === c && 0 === u || 4 === t) && y === T && (y = -5), y) }, i.inflateEnd = function (e) { if (!e || !e.state) return U; var t = e.state; return t.window && (t.window = null), e.state = null, T }, i.inflateGetHeader = function (e, t) { var i; return e && e.state ? 0 == (2 & (i = e.state).wrap) ? U : ((i.head = t).done = !1, T) : U }, i.inflateSetDictionary = function (e, t) { var i, n = t.length; return e && e.state ? 0 !== (i = e.state).wrap && 11 !== i.mode ? U : 11 === i.mode && R(1, t, n, 0) !== i.check ? -3 : j(e, t, n, n) ? (i.mode = 31, -4) : (i.havedict = 1, T) : U }, i.inflateInfo = "pako inflate (from Nodeca project)" }, { "../utils/common": 1, "./adler32": 3, "./crc32": 5, "./inffast": 7, "./inftrees": 9 }], 9: [function (e, t, i) { "use strict"; var I = e("../utils/common"), D = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0], T = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78], U = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0], F = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64]; t.exports = function (e, t, i, n, a, r, o, s) { var f, l, d, c, u, h, b, m, w, k = s.bits, _ = 0, g = 0, v = 0, p = 0, x = 0, y = 0, S = 0, E = 0, Z = 0, B = 0, A = null, z = 0, R = new I.Buf16(16), N = new I.Buf16(16), O = null, C = 0; for (_ = 0; _ <= 15; _++)R[_] = 0; for (g = 0; g < n; g++)R[t[i + g]]++; for (x = k, p = 15; 1 <= p && 0 === R[p]; p--); if (p < x && (x = p), 0 === p) return a[r++] = 20971520, a[r++] = 20971520, s.bits = 1, 0; for (v = 1; v < p && 0 === R[v]; v++); for (x < v && (x = v), _ = E = 1; _ <= 15; _++)if (E <<= 1, (E -= R[_]) < 0) return -1; if (0 < E && (0 === e || 1 !== p)) return -1; for (N[1] = 0, _ = 1; _ < 15; _++)N[_ + 1] = N[_] + R[_]; for (g = 0; g < n; g++)0 !== t[i + g] && (o[N[t[i + g]]++] = g); if (h = 0 === e ? (A = O = o, 19) : 1 === e ? (A = D, z -= 257, O = T, C -= 257, 256) : (A = U, O = F, -1), _ = v, u = r, S = g = B = 0, d = -1, c = (Z = 1 << (y = x)) - 1, 1 === e && 852 < Z || 2 === e && 592 < Z) return 1; for (; ;) { for (b = _ - S, w = o[g] < h ? (m = 0, o[g]) : o[g] > h ? (m = O[C + o[g]], A[z + o[g]]) : (m = 96, 0), f = 1 << _ - S, v = l = 1 << y; a[u + (B >> S) + (l -= f)] = b << 24 | m << 16 | w | 0, 0 !== l;); for (f = 1 << _ - 1; B & f;)f >>= 1; if (0 !== f ? (B &= f - 1, B += f) : B = 0, g++, 0 == --R[_]) { if (_ === p) break; _ = t[i + o[g]] } if (x < _ && (B & c) !== d) { for (0 === S && (S = x), u += v, E = 1 << (y = _ - S); y + S < p && !((E -= R[y + S]) <= 0);)y++, E <<= 1; if (Z += 1 << y, 1 === e && 852 < Z || 2 === e && 592 < Z) return 1; a[d = B & c] = x << 24 | y << 16 | u - r | 0 } } return 0 !== B && (a[u + B] = _ - S << 24 | 64 << 16 | 0), s.bits = x, 0 } }, { "../utils/common": 1 }], 10: [function (e, t, i) { "use strict"; t.exports = { 2: "need dictionary", 1: "stream end", 0: "", "-1": "file error", "-2": "stream error", "-3": "data error", "-4": "insufficient memory", "-5": "buffer error", "-6": "incompatible version" } }, {}], 11: [function (e, t, i) { "use strict"; t.exports = function () { this.input = null, this.next_in = 0, this.avail_in = 0, this.total_in = 0, this.output = null, this.next_out = 0, this.avail_out = 0, this.total_out = 0, this.msg = "", this.state = null, this.data_type = 2, this.adler = 0 } }, {}], "/lib/inflate.js": [function (e, t, i) { "use strict"; var c = e("./zlib/inflate"), u = e("./utils/common"), h = e("./utils/strings"), b = e("./zlib/constants"), n = e("./zlib/messages"), a = e("./zlib/zstream"), r = e("./zlib/gzheader"), m = Object.prototype.toString; function o(e) { if (!(this instanceof o)) return new o(e); this.options = u.assign({ chunkSize: 16384, windowBits: 0, to: "" }, e || {}); var t = this.options; t.raw && 0 <= t.windowBits && t.windowBits < 16 && (t.windowBits = -t.windowBits, 0 === t.windowBits && (t.windowBits = -15)), !(0 <= t.windowBits && t.windowBits < 16) || e && e.windowBits || (t.windowBits += 32), 15 < t.windowBits && t.windowBits < 48 && 0 == (15 & t.windowBits) && (t.windowBits |= 15), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new a, this.strm.avail_out = 0; var i = c.inflateInit2(this.strm, t.windowBits); if (i !== b.Z_OK) throw new Error(n[i]); if (this.header = new r, c.inflateGetHeader(this.strm, this.header), t.dictionary && ("string" == typeof t.dictionary ? t.dictionary = h.string2buf(t.dictionary) : "[object ArrayBuffer]" === m.call(t.dictionary) && (t.dictionary = new Uint8Array(t.dictionary)), t.raw && (i = c.inflateSetDictionary(this.strm, t.dictionary)) !== b.Z_OK)) throw new Error(n[i]) } function s(e, t) { var i = new o(t); if (i.push(e, !0), i.err) throw i.msg || n[i.err]; return i.result } o.prototype.push = function (e, t) { var i, n, a, r, o, s = this.strm, f = this.options.chunkSize, l = this.options.dictionary, d = !1; if (this.ended) return !1; n = t === ~~t ? t : !0 === t ? b.Z_FINISH : b.Z_NO_FLUSH, "string" == typeof e ? s.input = h.binstring2buf(e) : "[object ArrayBuffer]" === m.call(e) ? s.input = new Uint8Array(e) : s.input = e, s.next_in = 0, s.avail_in = s.input.length; do { if (0 === s.avail_out && (s.output = new u.Buf8(f), s.next_out = 0, s.avail_out = f), (i = c.inflate(s, b.Z_NO_FLUSH)) === b.Z_NEED_DICT && l && (i = c.inflateSetDictionary(this.strm, l)), i === b.Z_BUF_ERROR && !0 === d && (i = b.Z_OK, d = !1), i !== b.Z_STREAM_END && i !== b.Z_OK) return this.onEnd(i), !(this.ended = !0); s.next_out && (0 !== s.avail_out && i !== b.Z_STREAM_END && (0 !== s.avail_in || n !== b.Z_FINISH && n !== b.Z_SYNC_FLUSH) || ("string" === this.options.to ? (a = h.utf8border(s.output, s.next_out), r = s.next_out - a, o = h.buf2string(s.output, a), s.next_out = r, s.avail_out = f - r, r && u.arraySet(s.output, s.output, a, r, 0), this.onData(o)) : this.onData(u.shrinkBuf(s.output, s.next_out)))), 0 === s.avail_in && 0 === s.avail_out && (d = !0) } while ((0 < s.avail_in || 0 === s.avail_out) && i !== b.Z_STREAM_END); return i === b.Z_STREAM_END && (n = b.Z_FINISH), n === b.Z_FINISH ? (i = c.inflateEnd(this.strm), this.onEnd(i), this.ended = !0, i === b.Z_OK) : n !== b.Z_SYNC_FLUSH || (this.onEnd(b.Z_OK), !(s.avail_out = 0)) }, o.prototype.onData = function (e) { this.chunks.push(e) }, o.prototype.onEnd = function (e) { e === b.Z_OK && ("string" === this.options.to ? this.result = this.chunks.join("") : this.result = u.flattenChunks(this.chunks)), this.chunks = [], this.err = e, this.msg = this.strm.msg }, i.Inflate = o, i.inflate = s, i.inflateRaw = function (e, t) { return (t = t || {}).raw = !0, s(e, t) }, i.ungzip = s }, { "./utils/common": 1, "./utils/strings": 2, "./zlib/constants": 4, "./zlib/gzheader": 6, "./zlib/inflate": 8, "./zlib/messages": 10, "./zlib/zstream": 11 }] }, {}, [])("/lib/inflate.js") });
    </script>
</head>
<body style="margin: 0; padding: 0; height: 100%;">
    <div style="width: 100%; position: absolute;">
        <div class="divHeader">
            <div>
                <pre id="topbar"></pre>
                <a onclick="toggleLog()" href="javascript:void(0);" class="aTitle">日志</a>
            </div>
            <label id="lblVer"></label>
        </div>
        <div style="padding: 0px 20px 20px 20px;">
            <pre id="content"></pre>
        </div>
    </div>
    <div id="divLog" style="width: 0px; position: fixed; visibility: hidden;">
        <div id="logHeader" style="background: #F1F1F1; border: 1px solid #E0E0E0; padding: 10px 0px 10px 0px;">
            <a onclick="closeLog()" href="javascript:void(0);" class="aTitle">关闭</a>
            <a onclick="clearLog()" href="javascript:void(0);" class="aTitle">清除</a>
            <a onclick="historyLog()" href="javascript:void(0);" class="aTitle">历史</a>
        </div>
        <div id="logContent" style="padding: 10px 10px 10px 10px; background: black; color: white; overflow: auto;">
            <pre id="log"></pre>
        </div>
    </div>

    <script>
        var _rpcUrl = location.href.substr(0, location.href.lastIndexOf("/")) + "/.c";
        window.onload = function ()
        {
            call('["","Admin.GetInitInfo"]').then(function (txt)
            {
                var result = JSON.parse(txt);
                if (result.length == 3)
                {
                    var dt = result[2];
                    document.title = dt[1];
                    $("topbar").innerHTML = dt[2];
                    $("lblVer").innerText = dt[3];
                    $("content").innerHTML = dt[4];
                }
                else
                {
                    $("content").innerText = txt;
                }
                saveState();
            });
        }

        function $(id)
        {
            return document.getElementById(id);
        }

        function call(content)
        {
            return new Promise(function (resolve, reject)
            {
                var xhr = new XMLHttpRequest();
                xhr.responseType = "arraybuffer";
                xhr.open("post", _rpcUrl, true);
                // 内部用户标识
                xhr.setRequestHeader("uid", "110");
                xhr.onload = function ()
                {
                    if (xhr.status == 200)
                        resolve(readFrame(xhr.response));
                };
                xhr.send(writeFrame(content));
            });
        }

        function load(p_request, p_isHtml)
        {
            call(p_request).then(function (txt)
            {
                var result = JSON.parse(txt);
                if (result.length == 3)
                {
                    if (p_isHtml)
                        $("content").innerHTML = result[2];
                    else
                        $("content").innerText = result[2];
                }
                else
                {
                    $("content").innerText = txt;
                }
                saveState();
                return false;
            });
        }

        function onTest()
        {
            call($("methodCall").value).then(function (txt)
            {
                var result = JSON.parse(txt);
                if (result.length == 3)
                {
                    $("tdTitle").innerText = (result[0] == 0 ? "成功，耗时" : "调用失败！耗时") + result[1] + "毫秒";
                    if (Object.prototype.toString.call(result[2]) === "[object String]")
                        $("tdResult").innerText = result[2];
                    else
                        $("tdResult").innerText = formatJson(JSON.stringify(result[2]));
                }
                else
                {
                    $("tdResult").innerText = formatJson(txt);
                }
                saveState();
            });
        }

        function onCopy()
        {
            var selection = window.getSelection();
            var range = document.createRange();
            range.selectNodeContents($("tdResult"));
            selection.removeAllRanges();
            selection.addRange(range);
            document.execCommand("Copy");
        }

        function loadAgent(cls)
        {
            call('["","Admin.GetAgentClass", "' + cls + '"]').then(function (txt)
            {
                var result = JSON.parse(txt);
                $("content").innerText = (result.length == 3) ? result[2] : txt;

                var selection = window.getSelection();
                var range = document.createRange();
                range.selectNodeContents($("content"));
                selection.removeAllRanges();
                selection.addRange(range);
                saveState();
                return false;
            });
        }

        function saveState()
        {
            // 将当前内容保存到历史，前进/后退时用
            window.history.pushState({ "html": $("content").innerHTML }, "", null);
        }

        window.onpopstate = function (event)
        {
            // 前进/后退时加载历史记录
            if (event.state)
                $("content").innerHTML = event.state.html;
        }

        function formatJson(json)
        {
            var result = [];
            var length = json.length;
            var number = 0;
            var key = 0;
            var line = '\n';

            for (var i = 0; i < length; i++)
            {
                key = json.charAt(i);

                if ((key == '[') || (key == '{'))
                {
                    if ((i - 1 > 0) && (json.charAt(i - 1) == ':'))
                    {
                        result.push(line);
                        result.push(indent(number));
                    }

                    result.push(key);
                    result.push(line);
                    number++;
                    result.push(indent(number));
                    continue;
                }

                if ((key == ']') || (key == '}'))
                {
                    result.push(line);
                    number--;
                    result.push(indent(number));
                    result.push(key);
                    continue;
                }

                if ((key == ','))
                {
                    result.push(key);
                    result.push(line);
                    result.push(indent(number));
                    continue;
                }
                result.push(key);
            }
            return result.join('');
        }

        function indent(number)
        {
            var result = [];
            for (var i = 0; i < number; i++)
            {
                result.push('    ');
            }
            return result.join('');
        }

        function writeFrame(str)
        {
            // Frame内容
            var data = [];
            var len, c;
            len = str.length;
            for (var i = 0; i < len; i++)
            {
                c = str.charCodeAt(i);
                if (c >= 0x010000 && c <= 0x10FFFF)
                {
                    data.push(((c >> 18) & 0x07) | 0xF0);
                    data.push(((c >> 12) & 0x3F) | 0x80);
                    data.push(((c >> 6) & 0x3F) | 0x80);
                    data.push((c & 0x3F) | 0x80);
                }
                else if (c >= 0x000800 && c <= 0x00FFFF)
                {
                    data.push(((c >> 12) & 0x0F) | 0xE0);
                    data.push(((c >> 6) & 0x3F) | 0x80);
                    data.push((c & 0x3F) | 0x80);
                }
                else if (c >= 0x000080 && c <= 0x0007FF)
                {
                    data.push(((c >> 6) & 0x1F) | 0xC0);
                    data.push((c & 0x3F) | 0x80);
                }
                else
                {
                    data.push(c & 0xFF);
                }
            }

            // Frame头
            var header = [];
            // 始终不压缩
            header.push(0 & 0xFF);
            // 内容长度
            len = data.length;
            header.push((len >> 24) & 0xFF);
            header.push((len >> 16) & 0xFF);
            header.push((len >> 8) & 0xFF);
            header.push(len & 0xFF);

            return new Uint8Array(header.concat(data));
        }

        function readFrame(buf)
        {
            // 1字节压缩标志 + 4字节内容长度
            var arr = new Uint8Array(buf);

            // Frame内容
            var data;
            if (arr[0] == 1)
                data = pako.inflate(arr.slice(5));
            else
                data = arr.slice(5);

            // 字节转utf8
            var str = "";
            for (var i = 0; i < data.length; i++)
            {
                var one = data[i].toString(2),
                    v = one.match(/^1+?(?=0)/);
                if (v && one.length == 8)
                {
                    var bytesLength = v[0].length;
                    var store = data[i].toString(2).slice(7 - bytesLength);
                    for (var st = 1; st < bytesLength; st++)
                    {
                        store += data[st + i].toString(2).slice(2);
                    }
                    str += String.fromCharCode(parseInt(store, 2));
                    i += bytesLength - 1;
                }
                else
                {
                    str += String.fromCharCode(data[i]);
                }
            }
            return str;
        }

        /************************ 日志 ************************/
        function toggleLog()
        {
            var box = $("divLog");
            if (box.style.visibility == "hidden")
            {
                // 标准模式时document.documentElement
                var body = (document.compatMode && document.compatMode == 'CSS1Compat') ? document.documentElement : document.body;
                if (box.clientWidth == 0)
                {
                    // 初始化
                    var height = body.clientHeight > 600 ? 600 : body.clientHeight;
                    box.style.height = height + "px";
                    $("logContent").style.height = height - 70 + "px";
                    box.style.top = body.clientHeight - height + "px";

                    var width = body.clientWidth > 600 ? 600 : body.clientWidth;
                    box.style.width = width + "px";
                    box.style.left = body.clientWidth - width - 5 + "px";
                }
                else
                {
                    if (body.clientHeight - box.offsetTop < 50)
                        box.style.top = body.clientHeight - box.clientHeight + "px";
                    else if (box.offsetTop < 0)
                        box.style.top = "0px";

                    if (body.clientWidth - box.offsetLeft < box.clientWidth)
                        box.style.left = body.clientWidth - box.clientWidth + "px";
                    else if (box.offsetLeft < 0)
                        box.style.left = "0px";
                }

                box.style.visibility = "visible";
                receiveLog();
            }
            else
            {
                closeLog();
            }
        }

        var logRequest = null;
        var logIndex = 0;
        var _logUrl = location.href.substr(0, location.href.lastIndexOf("/")) + "/.log?index=";

        function receiveLog()
        {
            if (logRequest !== null)
            {
                logRequest.abort();
                logRequest = null;
            }

            logRequest = new XMLHttpRequest();
            logRequest.open("get", _logUrl + logIndex, true);
            logRequest.onload = function ()
            {
                if (logRequest.status == 200)
                {
                    // 返回格式：日志索引+日志列表
                    var split = logRequest.response.indexOf("+");
                    if (split > -1)
                    {
                        logIndex = logRequest.response.substring(0, split);
                        $("log").innerHTML += logRequest.response.substring(split + 1);
                    }

                    if ($("divLog").style.visibility == "visible")
                    {
                        var div = $("logContent");
                        div.scrollTop = div.scrollHeight;
                        receiveLog();
                    }
                }
            };
            logRequest.send();
        }

        function closeLog()
        {
            $("divLog").style.visibility = "hidden";
            if (logRequest !== null)
            {
                logRequest.abort();
                logRequest = null;
            }
        }

        function clearLog()
        {
            $("log").innerHTML = "";
        }

        function historyLog()
        {
            call('["","Admin.GetHistoryLogFile"]').then(function (txt)
            {
                var result = JSON.parse(txt);
                if (result.length == 3)
                {
                    $("log").innerHTML += '\n<span class="logTitle">历史日志文件</span>\n' + result[2] + '\n';
                }
            });
        }

        function downloadLogFile(fileName)
        {
            var xhr = new XMLHttpRequest();
            xhr.responseType = "blob";
            xhr.open("post", location.href.substr(0, location.href.lastIndexOf("/")) + "/.download", true);
            xhr.onload = function ()
            {
                if (xhr.status == 200)
                {
                    var elink = document.createElement('a');
                    elink.download = fileName;
                    elink.style.display = 'none';
                    var blob = new Blob([xhr.response]);
                    elink.href = URL.createObjectURL(blob);
                    document.body.appendChild(elink);
                    elink.click();
                    document.body.removeChild(elink);
                }
            };
            xhr.send("etc\\log\\" + fileName);
        }

        var oldX,
            oldY,
            dragable = false,
            dragHeader = $("logHeader"),
            dragBox = $("divLog");

        dragHeader.addEventListener("mousedown", function (e)
        {
            dragable = true;
            oldX = e.clientX;
            oldY = e.clientY;
        }, false);

        document.addEventListener("mousemove", function (e)
        {
            if (dragable === true)
            {
                dragBox.style.left = getCss("left") + e.clientX - oldX + "px";
                dragBox.style.top = getCss("top") + e.clientY - oldY + "px";
                oldX = e.clientX;
                oldY = e.clientY;
            }
        });

        dragHeader.addEventListener("mouseup", function (e)
        {
            dragable = false;
        }, false);

        function getCss(prop)
        {
            return parseInt(window.getComputedStyle(dragBox)[prop]);
        }
    </script>
</body>
</html>